package com.company.ljh.medium;

import java.util.Stack;

/**
 * @description:
 * 735. 行星碰撞
 * 提示
 * 中等
 * 412
 * 相关企业
 * 给定一个整数数组 asteroids，表示在同一行的行星。
 *
 * 对于数组中的每一个元素，其绝对值表示行星的大小，正负表示行星的移动方向（正表示向右移动，负表示向左移动）。每一颗行星以相同的速度移动。
 *
 * 找出碰撞后剩下的所有行星。碰撞规则：两个行星相互碰撞，较小的行星会爆炸。如果两颗行星大小相同，则两颗行星都会爆炸。两颗移动方向相同的行星，永远不会发生碰撞。
 *
 *
 * @projectName:leet_code
 * @see:com.company.ljh.medium
 * @author:ljh
 * @createTime:2023/7/3 18:12
 * @version:1.0
 */
public class 行星碰撞 {
    public static void main(String[] args) {
        asteroidCollision(new int[]{-2,-2,1,-2});
    }
    //解法2，优化条件
    public static int[] asteroidCollision(int[] asteroids) {
        Stack<Integer> stack = new Stack();
        int i =0;
        while(i< asteroids.length){
            //当前行星存活标记，默认行星存活
            boolean isAlive = true;
            //两个行星碰撞的情况 栈非空，栈顶大于0，当前行星小于0,当前行星未爆炸
            while(!stack.isEmpty()&&stack.peek() > 0&& asteroids[i] < 0&&isAlive){
                //放前面防止stack 出栈后无法判断大小问题
                //当 栈顶绝对值大于等于当前行星，当前行星爆炸
                if(stack.peek() + asteroids[i] >= 0){
                    isAlive = false;
                }
                //当 栈顶绝对值小于等于当前行星，栈顶爆炸
                if(stack.peek() + asteroids[i] <=0){
                    stack.pop();
                }

            }
            if(isAlive){
                stack.push(asteroids[i]);
            }
            i++;
        }
        int [] result = new int[stack.size()];
        for(int j = stack.size()-1;j >= 0;j--){
            result[j] = stack.pop();
        }
        return result;
    }

    //条件太多太杂
    public static int[] asteroidCollision2(int[] asteroids) {
        Stack<Integer> stack = new Stack();
        int i =0;
        while(i< asteroids.length){
            if(stack.isEmpty()||stack.peek() < 0||stack.peek() * asteroids[i] > 0 ){
                stack.push(asteroids[i]);
                i++;
            }else{
                while(!stack.isEmpty()){
                    if(stack.peek() > 0 && asteroids[i] >0 ){
                        //当前行星不炸，碰撞结束
                        break;
                    }else
                    if(stack.peek() > 0 && Math.abs(asteroids[i]) > Math.abs(stack.peek())){
                        //当前行星不炸，并继续碰撞
                        stack.pop();
                    }else if (asteroids[i] == -stack.peek()){
                        //当前行星炸，结束碰撞
                        i++;
                        stack.pop();
                        break;
                    }else if (stack.peek() > 0 && Math.abs(asteroids[i]) < Math.abs(stack.peek())){
                        //当前行星炸，结束碰撞
                        i++;
                        break;
                    }else if(stack.peek() < 0){
                        break;
                    }

                }

            }
        }
        int [] result = new int[stack.size()];
        for(int j = stack.size()-1;j >= 0;j--){
            result[j] = stack.pop();
        }
        return result;
    }
}
